﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Estimador_EDAL
{
    public partial class Form_Main : Form
    {
        public Form_Main()
        {
            InitializeComponent();
            MessageBox.Show("Alteração Helon Braz!");
        }

        #region Rotinas do MQP

        private void btn_RunMQP_Click(object sender, EventArgs e)
        {
            if (!DadosOK())
            {
                System.Diagnostics.Debug.WriteLine("Falha (Form_Main.btn_RunMQP_Click): há dados de entrada faltando ou fornecidos incorretamente.");
                return;
            }

            string report = "";

            Estimador.CEstimadorDeEstadoMQP estimador = new Estimador.CEstimadorDeEstadoMQP(100, 0.000001);

            estimador.ImprimeDadosRede = this.checkBox_ImprimirDadosRede.Checked;
            estimador.ImprimeValidacaoRede = this.checkBox_ImprimirValidacaoRede.Checked;
            estimador.ImprimeDadosMed = this.checkBox_ImprimirDadosMed.Checked;
            estimador.ImprimeValidacaoMed = this.checkBox_ImprimirValidacaoMed.Checked;
            estimador.ImprimeDadosEstado = this.checkBox_ImprimirDadosEstEsperado.Checked;
            estimador.ImprimeValidacaoEstado = this.checkBox_ImprimirValidacaoEstEsperado.Checked;

            estimador.ImprimeIteracoes = this.checkBox_ImprimirIteracoesMQP.Checked;
            estimador.HabilitaMQP = this.checkBox_HabilitaMQP.Checked;

            estimador.CarregaRedeDeArquivo(textBox_FileNameRede.Text, ref report, ref report);
            estimador.CarregaMedDeArquivo(textBox_FileNameMed.Text, ref report, ref report);
            estimador.CarregaEstadoDeArquivo(textBox_FileNameEstEsperado.Text, ref report, ref report);

            bool convergiu = estimador.Resolve(ref report);
            System.IO.File.WriteAllText(textBox_FileNameOutput.Text, report);

            //Essa parte de diagram é fictícia... resta implementar a passagem de dados do estimador para o diagram.
            if (convergiu)
            {
                Interface_View.DiagramView form = new Interface_View.DiagramView(1.00);
                form.ImagemOriginal = new Bitmap(textBox_FileNameDiagram.Text);
                form.CarregaDataCollectionDeArquivo(textBox_FileNameDiagramData.Text, ref report, ref report);
                MessageBox.Show("Estimador MQP convergiu! Resultados salvos no arquivo de saída e diagrama gerado para ser aberto em seguida...", "Resultado", MessageBoxButtons.OK);
                form.ShowDialog();
            }
            else
            {
                MessageBox.Show("Estimador MQP não convergiu! Resultados salvos no arquivo de saída...", "Resultado", MessageBoxButtons.OK);
            }
        }

        private bool DadosOK()
        {
            if (!System.IO.File.Exists(textBox_FileNameRede.Text))
                return false;

            if (!System.IO.File.Exists(textBox_FileNameMed.Text))
                return false;

            if (!System.IO.File.Exists(textBox_FileNameEstEsperado.Text))
                return false;

            if (!System.IO.File.Exists(textBox_FileNameDiagram.Text))
                return false;

            if (!System.IO.File.Exists(textBox_FileNameDiagramData.Text))
                return false;

            if (System.IO.File.Exists(textBox_FileNameOutput.Text))
            {
                if (MessageBox.Show("O arquivo de saída fornecido já existe. Deseja sobrescrevê-lo?", "Dúvida", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                    return true;
                else
                    return false;
            }

            return true;
        }

        #endregion Rotinas do MQP

        #region Rotinas de seleção dos nomes dos arquivos de entrada e saída

        private string GetOpenFileNameFromUser(string title, string filter)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Title = title;
            dlg.Filter = filter;
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) return dlg.FileName;
            return "";
        }

        private string GetSaveFileNameFromUser(string title, string filter)
        {
            SaveFileDialog dlg = new SaveFileDialog();
            dlg.Title = title;
            dlg.OverwritePrompt = false;
            dlg.Filter = filter;
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) return dlg.FileName;
            return "";
        }

        private void textBox_FileNameRede_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            string ret = GetOpenFileNameFromUser("Forneça o caminho para o arquivo com a rede elétrica...", "Arquivo de texto (*.txt)|*.txt|Todos os arquivos (*.*)|*.*");
            if(ret != "") textBox_FileNameRede.Text = ret;
        }

        private void textBox_FileNameMed_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            string ret = GetOpenFileNameFromUser("Forneça o caminho para o arquivo com as medições...", "Arquivo de texto (*.txt)|*.txt|Todos os arquivos (*.*)|*.*");
            if (ret != "") textBox_FileNameMed.Text = ret;
        }

        private void textBox_FileNameEstEsperado_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            string ret = GetOpenFileNameFromUser("Forneça o caminho para o arquivo com os estados esperados...", "Arquivo de texto (*.txt)|*.txt|Todos os arquivos (*.*)|*.*");
            if (ret != "") textBox_FileNameEstEsperado.Text = ret;
        }

        private void textBox_FileNameDiagram_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            string ret = GetOpenFileNameFromUser("Forneça o caminho para o arquivo com o diagrama base...", "Imagem (*.jpg)|*.jpg|Todos os arquivos (*.*)|*.*");
            if (ret != "") textBox_FileNameDiagram.Text = ret;
        }

        private void textBox_FileNameDiagramData_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            string ret = GetOpenFileNameFromUser("Forneça o caminho para o arquivo com a lista de (x, y) dos estados medidos e estimados...", "Arquivo de texto (*.txt)|*.txt|Todos os arquivos (*.*)|*.*");
            if (ret != "") textBox_FileNameDiagramData.Text = ret;
        }

        private void textBox_FileNameOutput_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            string ret = GetSaveFileNameFromUser("Forneça o caminho para o arquivo de saída do programa...", "Arquivo de texto (*.txt)|*.txt|Todos os arquivos (*.*)|*.*");
            if (ret != "") textBox_FileNameOutput.Text = ret;
        }

        #endregion Rotinas de seleção dos nomes dos arquivos de entrada e saída

    }
}
